package com.google.code.jtasks.client.startup;

import com.google.code.jtasks.client.modules.ClientConfigurationModule;
import com.google.code.jtasks.client.modules.CommandsModule;
import com.google.code.jtasks.client.modules.JerseyClientModule;
import com.google.code.jtasks.client.modules.LanternaModule;
import com.google.code.jtasks.client.ui.CommandDispatcher;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.googlecode.lanterna.screen.Screen;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Точка входа в программу.
 */
public class Main {
    private static final Logger LOG = LoggerFactory.getLogger(Main.class);

    public static void main(String[] args) {
        // Создаём инжектор и перечисляем наши модули
        Injector injector = Guice.createInjector(
            new ClientConfigurationModule(),
            new CommandsModule(),
            new LanternaModule(),
            new JerseyClientModule()
        );

        // Создаём с помощью инжектора объект Screen
        // Переменная объявляется здесь, потому что мы её используем в finally
        Screen screen = null;
        try {
            // Запускаем Screen (см. документацию по Lanterna)
            screen = injector.getInstance(Screen.class);
            screen.startScreen();

            // Создаём диспетчер команд и запускаем его
            CommandDispatcher dispatcher = injector.getInstance(CommandDispatcher.class);
            dispatcher.mainLoop();

        } catch (Exception e) {
            LOG.error("Main loop has failed", e);

        } finally {
            if (screen != null) {
                screen.stopScreen();
            }
        }
    }
}
